gh-142889: Improve layout of dictionary keys - #150640
Conversation
|
Have you asked @clintonsteiner if it is OK for you to take over their work? |
|
@markshannon No, I didn't. I thought it would be okay to create a new PR since the head repo of #145097 was deleted a month ago. However, I can close this if you think this is unfair. @clintonsteiner Do you want to continue this? |
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
|
@markshannon, a reminder about this pr, whenever you get a chance. |
|
I guess we aren't going to hear from @clintonsteiner. @brijkapadia is this all your own work, or did you use @clintonsteiner's code? Do you have any performance numbers for this? |
|
This is mainly my work. While there were many similarities to begin with, after gh-150490, I had to restructure the code. Right now I'm away from my computer, but I could try to get performance numbers next week. |
|
Here are the numbers: pyperformance benchmarks
ascii85_largeMean +- std dev: 9.55 ms +- 0.18 ms -> 11.47 ms +- 0.62 ms: 1.20x slower ascii85_smallMean +- std dev: 461 us +- 7 us -> 559 us +- 24 us: 1.21x slower async_generatorsMean +- std dev: 341 ms +- 8 ms -> 371 ms +- 12 ms: 1.09x slower async_tree_cpu_io_mixedMean +- std dev: 454 ms +- 16 ms -> 491 ms +- 17 ms: 1.08x slower async_tree_cpu_io_mixed_tgMean +- std dev: 471 ms +- 17 ms -> 502 ms +- 20 ms: 1.06x slower async_tree_eagerMean +- std dev: 87.5 ms +- 2.1 ms -> 93.5 ms +- 4.2 ms: 1.07x slower async_tree_eager_cpu_io_mixedMean +- std dev: 339 ms +- 12 ms -> 356 ms +- 13 ms: 1.05x slower async_tree_eager_cpu_io_mixed_tgMean +- std dev: 425 ms +- 14 ms -> 453 ms +- 18 ms: 1.07x slower async_tree_eager_ioMean +- std dev: 590 ms +- 13 ms -> 637 ms +- 21 ms: 1.08x slower async_tree_eager_io_tgMean +- std dev: 617 ms +- 50 ms -> 663 ms +- 53 ms: 1.07x slower async_tree_eager_memoizationMean +- std dev: 183 ms +- 9 ms -> 194 ms +- 11 ms: 1.06x slower async_tree_eager_memoization_tgMean +- std dev: 285 ms +- 18 ms -> 301 ms +- 19 ms: 1.05x slower async_tree_eager_tgMean +- std dev: 217 ms +- 12 ms -> 235 ms +- 16 ms: 1.08x slower async_tree_ioMean +- std dev: 588 ms +- 15 ms -> 637 ms +- 25 ms: 1.08x slower async_tree_io_tgMean +- std dev: 617 ms +- 40 ms -> 663 ms +- 44 ms: 1.07x slower async_tree_memoizationMean +- std dev: 327 ms +- 21 ms -> 346 ms +- 23 ms: 1.06x slower async_tree_memoization_tgMean +- std dev: 312 ms +- 14 ms -> 336 ms +- 15 ms: 1.08x slower async_tree_noneMean +- std dev: 245 ms +- 12 ms -> 263 ms +- 18 ms: 1.07x slower async_tree_none_tgMean +- std dev: 255 ms +- 17 ms -> 271 ms +- 21 ms: 1.07x slower asyncio_tcpMean +- std dev: 288 ms +- 8 ms -> 305 ms +- 13 ms: 1.06x slower asyncio_tcp_sslMean +- std dev: 934 ms +- 9 ms -> 986 ms +- 15 ms: 1.06x slower asyncio_websocketsMean +- std dev: 335 ms +- 9 ms -> 359 ms +- 12 ms: 1.07x slower base16_largeMean +- std dev: 7.47 ms +- 0.07 ms -> 8.84 ms +- 0.39 ms: 1.18x slower base16_smallMean +- std dev: 420 us +- 10 us -> 499 us +- 25 us: 1.19x slower base32_largeMean +- std dev: 2.59 ms +- 2.15 ms -> 2.51 ms +- 0.12 ms: 1.03x faster base32_smallMean +- std dev: 241 us +- 6 us -> 250 us +- 10 us: 1.04x slower base64_largeMean +- std dev: 1.99 ms +- 0.05 ms -> 2.13 ms +- 0.07 ms: 1.07x slower base64_smallMean +- std dev: 270 us +- 7 us -> 283 us +- 12 us: 1.05x slower base85_largeMean +- std dev: 3.34 ms +- 0.06 ms -> 3.85 ms +- 0.15 ms: 1.15x slower base85_smallMean +- std dev: 171 us +- 3 us -> 200 us +- 7 us: 1.17x slower bench_mp_poolMean +- std dev: 89.5 ms +- 59.9 ms -> 59.0 ms +- 30.1 ms: 1.52x faster bench_thread_poolMean +- std dev: 1.46 ms +- 0.20 ms -> 1.03 ms +- 0.26 ms: 1.43x faster bpe_tokeniserMean +- std dev: 3.27 sec +- 0.08 sec -> 3.67 sec +- 0.12 sec: 1.12x slower chameleonMean +- std dev: 10.7 ms +- 0.4 ms -> 11.6 ms +- 0.5 ms: 1.08x slower chaosMean +- std dev: 43.8 ms +- 1.3 ms -> 46.1 ms +- 2.4 ms: 1.05x slower comprehensionsMean +- std dev: 12.3 us +- 0.4 us -> 13.4 us +- 0.5 us: 1.09x slower connected_componentsMean +- std dev: 441 ms +- 4 ms -> 566 ms +- 86 ms: 1.28x slower coroutinesMean +- std dev: 16.7 ms +- 0.5 ms -> 18.5 ms +- 0.7 ms: 1.11x slower coverageMean +- std dev: 91.2 ms +- 7.7 ms -> 90.7 ms +- 2.9 ms: 1.00x faster create_gc_cyclesMean +- std dev: 1.53 ms +- 0.02 ms -> 1.63 ms +- 0.07 ms: 1.06x slower crypto_pyaesMean +- std dev: 54.3 ms +- 2.1 ms -> 59.1 ms +- 2.7 ms: 1.09x slower deepcopyMean +- std dev: 198 us +- 6 us -> 200 us +- 8 us: 1.01x slower deepcopy_memoMean +- std dev: 19.7 us +- 0.7 us -> 21.4 us +- 0.7 us: 1.09x slower deepcopy_reduceMean +- std dev: 2.24 us +- 0.07 us -> 2.28 us +- 0.12 us: 1.02x slower deltablueMean +- std dev: 2.46 ms +- 0.08 ms -> 2.60 ms +- 0.13 ms: 1.06x slower docutilsMean +- std dev: 1.85 sec +- 0.05 sec -> 1.96 sec +- 0.04 sec: 1.06x slower dulwich_logMean +- std dev: 44.8 ms +- 1.3 ms -> 48.3 ms +- 2.3 ms: 1.08x slower fannkuchMean +- std dev: 289 ms +- 9 ms -> 314 ms +- 11 ms: 1.09x slower floatMean +- std dev: 53.5 ms +- 1.4 ms -> 57.5 ms +- 3.2 ms: 1.08x slower gc_traversalMean +- std dev: 3.19 ms +- 0.07 ms -> 3.56 ms +- 0.13 ms: 1.11x slower generatorsMean +- std dev: 25.8 ms +- 0.5 ms -> 27.4 ms +- 1.5 ms: 1.06x slower goMean +- std dev: 88.9 ms +- 1.9 ms -> 98.3 ms +- 7.1 ms: 1.11x slower hexiomMean +- std dev: 4.62 ms +- 0.09 ms -> 5.20 ms +- 0.25 ms: 1.13x slower html5libMean +- std dev: 49.7 ms +- 1.2 ms -> 54.8 ms +- 3.2 ms: 1.10x slower json_dumpsMean +- std dev: 6.81 ms +- 0.15 ms -> 7.72 ms +- 0.71 ms: 1.13x slower json_loadsMean +- std dev: 18.3 us +- 0.5 us -> 20.7 us +- 1.2 us: 1.13x slower k_coreMean +- std dev: 2.23 sec +- 0.09 sec -> 3.11 sec +- 0.24 sec: 1.39x slower logging_formatMean +- std dev: 5.09 us +- 0.19 us -> 5.64 us +- 0.39 us: 1.11x slower logging_silentMean +- std dev: 73.9 ns +- 3.2 ns -> 82.0 ns +- 4.3 ns: 1.11x slower logging_simpleMean +- std dev: 4.49 us +- 0.14 us -> 4.91 us +- 0.23 us: 1.10x slower makoMean +- std dev: 8.73 ms +- 0.25 ms -> 10.04 ms +- 0.50 ms: 1.15x slower many_optionalsMean +- std dev: 593 us +- 14 us -> 645 us +- 41 us: 1.09x slower mdpMean +- std dev: 982 ms +- 26 ms -> 1203 ms +- 87 ms: 1.22x slower meteor_contestMean +- std dev: 81.0 ms +- 2.2 ms -> 90.1 ms +- 4.2 ms: 1.11x slower nbodyMean +- std dev: 73.4 ms +- 2.6 ms -> 83.4 ms +- 6.2 ms: 1.14x slower nqueensMean +- std dev: 61.0 ms +- 1.7 ms -> 80.5 ms +- 2.2 ms: 1.32x slower pathlibMean +- std dev: 9.21 ms +- 0.25 ms -> 13.20 ms +- 0.96 ms: 1.43x slower pickleMean +- std dev: 8.94 us +- 0.21 us -> 11.61 us +- 0.39 us: 1.30x slower pickle_dictMean +- std dev: 23.1 us +- 0.6 us -> 30.5 us +- 1.2 us: 1.32x slower pickle_listMean +- std dev: 3.94 us +- 0.12 us -> 5.43 us +- 0.31 us: 1.38x slower pickle_pure_pythonMean +- std dev: 252 us +- 6 us -> 333 us +- 18 us: 1.32x slower pidigitsMean +- std dev: 181 ms +- 3 ms -> 225 ms +- 39 ms: 1.24x slower pprint_pformatMean +- std dev: 1.26 sec +- 0.03 sec -> 1.20 sec +- 0.03 sec: 1.05x faster pprint_safe_reprMean +- std dev: 620 ms +- 16 ms -> 585 ms +- 25 ms: 1.06x faster pyflateMean +- std dev: 313 ms +- 6 ms -> 307 ms +- 7 ms: 1.02x faster python_startupMean +- std dev: 9.70 ms +- 0.22 ms -> 9.63 ms +- 0.20 ms: 1.01x faster python_startup_no_siteMean +- std dev: 5.78 ms +- 0.12 ms -> 5.77 ms +- 0.14 ms: 1.00x faster raytraceMean +- std dev: 224 ms +- 4 ms -> 219 ms +- 6 ms: 1.02x faster regex_compileMean +- std dev: 126 ms +- 4 ms -> 121 ms +- 3 ms: 1.04x faster regex_dnaMean +- std dev: 138 ms +- 4 ms -> 133 ms +- 4 ms: 1.03x faster regex_effbotMean +- std dev: 2.10 ms +- 0.06 ms -> 2.11 ms +- 0.04 ms: 1.00x slower regex_v8Mean +- std dev: 15.8 ms +- 0.4 ms -> 15.5 ms +- 0.4 ms: 1.02x faster richardsMean +- std dev: 36.4 ms +- 0.8 ms -> 37.0 ms +- 1.3 ms: 1.02x slower richards_superMean +- std dev: 42.4 ms +- 1.3 ms -> 42.8 ms +- 1.4 ms: 1.01x slower scimark_fftMean +- std dev: 220 ms +- 5 ms -> 228 ms +- 14 ms: 1.04x slower scimark_luMean +- std dev: 94.1 ms +- 3.8 ms -> 93.5 ms +- 3.5 ms: 1.01x faster scimark_monte_carloMean +- std dev: 49.5 ms +- 1.3 ms -> 51.1 ms +- 1.6 ms: 1.03x slower scimark_sorMean +- std dev: 88.9 ms +- 2.1 ms -> 89.0 ms +- 2.9 ms: 1.00x slower scimark_sparse_mat_multMean +- std dev: 3.28 ms +- 0.08 ms -> 3.28 ms +- 0.20 ms: 1.00x faster shortest_pathMean +- std dev: 462 ms +- 4 ms -> 630 ms +- 146 ms: 1.36x slower spectral_normMean +- std dev: 70.8 ms +- 1.9 ms -> 70.3 ms +- 1.5 ms: 1.01x faster sphinxMean +- std dev: 6.42 ms +- 0.18 ms -> 6.33 ms +- 0.14 ms: 1.01x faster sqlalchemy_declarativeMean +- std dev: 96.1 ms +- 2.5 ms -> 94.7 ms +- 1.6 ms: 1.01x faster sqlalchemy_imperativeMean +- std dev: 13.3 ms +- 0.3 ms -> 13.0 ms +- 0.3 ms: 1.02x faster sqlglot_v2_normalizeMean +- std dev: 89.1 ms +- 2.0 ms -> 88.1 ms +- 2.8 ms: 1.01x faster sqlglot_v2_optimizeMean +- std dev: 43.7 ms +- 0.9 ms -> 43.0 ms +- 1.3 ms: 1.02x faster sqlglot_v2_parseMean +- std dev: 938 us +- 27 us -> 934 us +- 20 us: 1.00x faster sqlglot_v2_transpileMean +- std dev: 1.18 ms +- 0.03 ms -> 1.16 ms +- 0.03 ms: 1.02x faster sqlite_synthMean +- std dev: 1.83 us +- 0.08 us -> 1.81 us +- 0.06 us: 1.01x faster subparsersMean +- std dev: 7.78 ms +- 0.21 ms -> 8.60 ms +- 0.50 ms: 1.11x slower telcoMean +- std dev: 5.93 ms +- 0.18 ms -> 5.75 ms +- 0.16 ms: 1.03x faster tomli_loadsMean +- std dev: 1.57 sec +- 0.05 sec -> 1.58 sec +- 0.04 sec: 1.01x slower tornado_httpMean +- std dev: 83.2 ms +- 2.4 ms -> 82.2 ms +- 2.8 ms: 1.01x faster typing_runtime_protocolsMean +- std dev: 107 us +- 4 us -> 102 us +- 4 us: 1.05x faster unpack_sequenceMean +- std dev: 35.4 ns +- 1.5 ns -> 37.1 ns +- 2.0 ns: 1.05x slower unpickleMean +- std dev: 11.0 us +- 0.3 us -> 10.6 us +- 0.3 us: 1.04x faster unpickle_listMean +- std dev: 3.57 us +- 0.10 us -> 3.48 us +- 0.10 us: 1.03x faster unpickle_pure_pythonMean +- std dev: 175 us +- 5 us -> 172 us +- 4 us: 1.02x faster urlsafe_base64_smallMean +- std dev: 300 us +- 7 us -> 320 us +- 14 us: 1.07x slower xdsl_constant_foldMean +- std dev: 39.4 ms +- 4.3 ms -> 39.4 ms +- 4.3 ms: 1.00x slower xml_etree_generateMean +- std dev: 72.2 ms +- 1.7 ms -> 74.2 ms +- 3.0 ms: 1.03x slower xml_etree_iterparseMean +- std dev: 78.5 ms +- 2.4 ms -> 76.7 ms +- 2.1 ms: 1.02x faster xml_etree_parseMean +- std dev: 119 ms +- 3 ms -> 118 ms +- 4 ms: 1.01x faster xml_etree_processMean +- std dev: 53.0 ms +- 1.6 ms -> 53.1 ms +- 2.0 ms: 1.00x slower It seems that this feature is a regression. |
This is based on the work of @clintonsteiner in PR #145097. Most of it is very similar although I did make my own changes.
This PR updates the memory layout of
_dictkeysobjectto improve performance.